<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        // 这是组合继承的一种优化版本，避免了调用父类构造函数两次的问题。
        function Parent(name) {
            this.name = name;
            this.colors = ['red', 'blue', 'green'];
        }

        Parent.prototype.sayName = function() {
            console.log(this.name);
        };

        function Child(name, age) {
            Parent.call(this, name); // 借用构造函数继承实例属性
            this.age = age;
        }

        Child.prototype = Object.create({}, Child.prototype ,Parent.prototype); // 使用Object.create继承父类原型
        Child.prototype.constructor = Child;

        const child1 = new Child('Child1', 10);
        const child2 = new Child('Child2', 20);

        child1.colors.push('black');

        console.log(child1.colors); // 输出 ['red', 'blue', 'green', 'black']
        console.log(child2.colors); // 输出 ['red', 'blue', 'green']

        child1.sayName(); // 输出 'Child1'


        // 特点：
        // 解决了组合继承调用父类构造函数两次的问题，是实现继承的最佳方式。
    </script>
</body>
</html>